package javacroft.view.GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javacroft.facade.Facade;
import javacroft.view.MouseOverHintManager;
import javacroft.view.MyPanel;
import javacroft.view.ViewIF;
import javax.swing.*;

/**
 * Classe qui permet à l'utilisateur (enseignant) dajouter et modifier une note ( de rattrapage ou non)
 * @author julien
 */
public class Enseignant extends JFrame implements ViewIF, ActionListener, FocusListener
{

   Facade myControlleur;
   Principale myAccueil;
   Toolkit tk;
   Dimension ecran;
   DecimalFormat df;
   MouseOverHintManager hintManager;
   int currentDateInt;
   int currentNbEtud, currentNbNotes;
   JComboBox boxDepartements, boxAnnee, boxMatiere;
   JButton alphaButton[] =
   {
      new JButton("A-D"), new JButton("E-M"), new JButton("N-Q"), new JButton("R-Z"), new JButton("Tous")
   };
   JButton boutonImporter, Valider, Actualiser;
   JTextField jtfMax, jtfMin, jtfTotal, jtfMoyenne;//, jtfValid, jtfEchoue;
   JMenuItem Nouveau, Importer, Exporter, Enregistrer, Quitter, Support, APropos;
   MyPanel Fond;
   JPanel conteneur;
   GridBagConstraints contrainte;
   JPanel panelStats;
   JPanel infosEtudiants;
   JLabel numEtudiants[];
   JCheckBox[] rattrapageEtudiant;
   JTextArea labelBulle;
   JTextField lesEtudiants[][];
   JPanel blocEtudiants;
   Font police = new Font("Serif", 0, 20);
   Font policeBulle = new Font("Serif", 0, 15);
   JLayeredPane superpoz = new JLayeredPane();
   JLabel sablier = new JLabel();
   String oldNote = "";
   int nbModifications = 0;

   /**
    * Constructeur de la classe, positionne tous les composants
    * @param unControlleur Facade de la vue, qui lui fournit tous les services nécessaires
    * @param uneAccueil Fenetre d'accueil de l'utilisateur qui est réaffichée si l'on quitte la fenetre pour lui permettre d'efectuer d'autres actions.
    */
   public Enseignant(Facade unControlleur, Principale uneAccueil)
   {
      super("Gestion des notes des étudiants");
      myControlleur = unControlleur;
      unControlleur.setView((ViewIF) this);
      this.myAccueil = uneAccueil;

      tk = Toolkit.getDefaultToolkit();
      ecran = tk.getScreenSize();

      contrainte = new GridBagConstraints();

      df = new DecimalFormat("#.##");
      df.setMaximumFractionDigits(2);

      labelBulle = new JTextArea();
      labelBulle.setEditable(false);
      labelBulle.setFont(policeBulle);
      labelBulle.setFont(labelBulle.getFont().deriveFont(Font.BOLD));
      hintManager = new MouseOverHintManager(new JLabel(), labelBulle);

      currentNbEtud = currentNbNotes = 0;// nbValid = nbEchoue = 0;
      //max = min = moyenne = currentNote = 0;

      boxDepartements = new JComboBox();
      //boxDepartements.removeAll();
      boxAnnee = new JComboBox();
      //boxAnnee.removeAll();
      boxMatiere = new JComboBox();
      //boxMatiere.removeAll();

      boutonImporter = new JButton("Importer");
      Valider = new JButton("Valider");

      Actualiser = new JButton("Actualiser");

      jtfMax = new JTextField();
      jtfMin = new JTextField();
      jtfTotal = new JTextField();
      jtfMoyenne = new JTextField();
      //jtfValid = new JTextField();
      //jtfEchoue = new JTextField();

      Nouveau = new JMenuItem("Nouveau");
      Importer = new JMenuItem("Importer");
      Exporter = new JMenuItem("Exporter");
      Enregistrer = new JMenuItem("Enregistrer");
      Quitter = new JMenuItem("Quitter");
      Support = new JMenuItem("Support");
      APropos = new JMenuItem("A Propos");

      Fond = new MyPanel("ecran8.jpg", 900, 700);
      Fond.setLayout(new FlowLayout(0, 10, 0));
      conteneur = new JPanel();
      conteneur.setLayout(new GridBagLayout());

      panelStats = new JPanel(new FlowLayout());
      infosEtudiants = new JPanel(new FlowLayout());
      numEtudiants = new JLabel[70];
      rattrapageEtudiant = new JCheckBox[numEtudiants.length];
      lesEtudiants = new JTextField[numEtudiants.length][3];
      blocEtudiants = new JPanel(new BorderLayout());
      //estUnEtudiant = new Boolean[numEtudiants.length];
      //estVisible = new Boolean[numEtudiants.length];

      //**Menu fichier
      Nouveau.setActionCommand("Nouveau");
      Nouveau.addActionListener(this);
      Importer.setActionCommand("Importer");
      Importer.addActionListener(this);
      Exporter.setActionCommand("Exporter");
      Exporter.addActionListener(this);
      Enregistrer.setActionCommand("Valider");
      Enregistrer.addActionListener(this);
      Quitter.setActionCommand("Quitter");
      Quitter.addActionListener(this);
      JMenu menuFichier = new JMenu("Fichier");
      menuFichier.add(Nouveau);
      menuFichier.add(Importer);
      menuFichier.add(Exporter);
      menuFichier.add(Enregistrer);
      menuFichier.add(Quitter);

      //**Menu aide
      Support.setActionCommand("Support");
      Support.addActionListener(this);
      JMenu menuAide = new JMenu("Aide");
      menuAide.add(Support);

      //**Menu A Propos
      APropos.setActionCommand("APropos");
      APropos.setPreferredSize(new Dimension(50, 20));
      APropos.addActionListener(this);

      //**barre des menus
      JMenuBar barreMenu = new JMenuBar();
      barreMenu.add(menuFichier);
      barreMenu.add(menuAide);
      barreMenu.add(APropos);

      JLabel labelDepartement = new JLabel("1. Choix du département:");
      labelDepartement.setForeground(Color.black);
      labelDepartement.setPreferredSize(new Dimension(350, 30));
      labelDepartement.setFont(police);
      contrainte.insets = new Insets(20, 0, 0, 0);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 0;
      conteneur.add(labelDepartement, contrainte);
      boxDepartements.setPreferredSize(new Dimension(300, 20));
      boxDepartements.setActionCommand("changeDep");
      hintManager.addHintFor(boxDepartements, "Selectionez le département pour lequel vous voulez entrer des notes.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxDepartements, contrainte);

      JLabel labelAnnee = new JLabel("2. Choix de l'année:");
      labelAnnee.setForeground(Color.black);
      labelAnnee.setPreferredSize(new Dimension(350, 30));
      labelAnnee.setFont(police);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 1;
      conteneur.add(labelAnnee, contrainte);

      boxAnnee.setPreferredSize(new Dimension(300, 20));
      boxAnnee.setActionCommand("changeAnnee");
      hintManager.addHintFor(boxAnnee, "Selectionez l'année pour laquelle vous voulez entrer des notes.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxAnnee, contrainte);

      JLabel labelMatiere = new JLabel("3. Choix de la matière:");

      labelMatiere.setPreferredSize(new Dimension(350, 30));
      labelMatiere.setForeground(Color.black);
      labelMatiere.setFont(police);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 2;
      conteneur.add(labelMatiere, contrainte);

      boxMatiere.setPreferredSize(new Dimension(300, 20));
      boxMatiere.setActionCommand("changeMatiere");
      hintManager.addHintFor(boxMatiere, "Selectionez la matière pour laquelle vous voulez entrer des notes.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxMatiere, contrainte);

      //**boutons pour l'ordre alphabétique
      JPanel panelBoutons = new JPanel(new FlowLayout());
      for (int i = 0; i < 5; i++)
      {
         alphaButton[i].addActionListener(this);
         alphaButton[i].setOpaque(false);
         alphaButton[i].setEnabled(false);
         panelBoutons.add(alphaButton[i]);
         if (i != 4)
         {
            alphaButton[i].setActionCommand((new StringBuilder()).append(Character.toString(alphaButton[i].getText().charAt(0))).append(Character.toString(alphaButton[i].getText().charAt(2))).toString());
         }
         else
         {
            alphaButton[i].setActionCommand("AZ");
         }
         hintManager.addHintFor(alphaButton[i], (new StringBuilder()).append("Cliquez pour afficher les étudiants dont le nom est entre ").append(alphaButton[i].getActionCommand().charAt(0)).append(" et ").append(alphaButton[i].getActionCommand().charAt(1)).toString());
      }

      contrainte.gridx = 1;
      contrainte.gridy = 4;
      contrainte.gridwidth = 4;
      conteneur.add(panelBoutons, contrainte);

      JPanel panelEtudiants = new JPanel(new FlowLayout());
      panelEtudiants.setPreferredSize(new Dimension(550, 290));
      panelEtudiants.setBorder(BorderFactory.createTitledBorder(""));

      JPanel labelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
      labelPanel.setPreferredSize(new Dimension(520, 25));

      JLabel labelNum = new JLabel("N°");
      labelNum.setPreferredSize(new Dimension(30, 20));
      labelNum.setForeground(Color.black);
      labelNum.setFont(police);
      labelPanel.add(labelNum);

      JLabel labelNom = new JLabel("Nom");
      labelNom.setPreferredSize(new Dimension(150, 20));
      labelNom.setForeground(Color.black);
      labelNom.setFont(police);
      labelPanel.add(labelNom);

      JLabel labelPrenom = new JLabel("Prénom");
      labelPrenom.setPreferredSize(new Dimension(150, 20));
      labelPrenom.setForeground(Color.black);
      labelPrenom.setFont(police);
      labelPanel.add(labelPrenom);

      JLabel labelNote = new JLabel("Note");
      labelNote.setPreferredSize(new Dimension(60, 20));
      labelNote.setForeground(Color.black);
      labelNote.setFont(police);
      labelPanel.add(labelNote);

      JLabel labelRattrapage = new JLabel("Rattr");
      labelRattrapage.setPreferredSize(new Dimension(90, 20));
      labelRattrapage.setForeground(Color.black);
      labelRattrapage.setFont(police);
      labelPanel.add(labelRattrapage);

      blocEtudiants.setPreferredSize(new Dimension(200, 28));
      for (int i = 0; i < numEtudiants.length; i++)
      {
         numEtudiants[i] = new JLabel((new StringBuilder()).append("").append(i + 1).append(".").toString());
         numEtudiants[i].setPreferredSize(new Dimension(30, 20));
         rattrapageEtudiant[i] = new JCheckBox();
         rattrapageEtudiant[i].setPreferredSize(new Dimension(90, 20));
         rattrapageEtudiant[i].setBorder(javax.swing.BorderFactory.createEmptyBorder());
         rattrapageEtudiant[i].setOpaque(false);
         rattrapageEtudiant[i].setSelected(false);
         rattrapageEtudiant[i].addActionListener(this);
         rattrapageEtudiant[i].setName("" + i);
         //estUnEtudiant[i] = Boolean.valueOf(false);
         //estVisible[i] = Boolean.valueOf(false);
         for (int j = 0; j < 3; j++)
         {
            if (j != 2)
            {
               lesEtudiants[i][j] = new JTextField();
               lesEtudiants[i][j].setPreferredSize(new Dimension(150, 20));
               lesEtudiants[i][j].setEditable(false);
            }
            else
            {
               lesEtudiants[i][j] = new JFormattedTextField("");
               lesEtudiants[i][j].addFocusListener(this);
               lesEtudiants[i][j].setDocument(new NumericDocument(2, 2));
               lesEtudiants[i][j].setPreferredSize(new Dimension(50, 20));
               lesEtudiants[i][j].setName("" + i);
            }
         }
      }

      panelEtudiants.add(labelPanel);

      blocEtudiants.add(infosEtudiants, "Center");
      JScrollPane ascenseur = new JScrollPane();
      ascenseur.setPreferredSize(new Dimension(530, 250));
      ascenseur.setViewportView(blocEtudiants);
      panelEtudiants.add(ascenseur);

      contrainte.insets = new Insets(10, 0, 0, 0);
      contrainte.gridwidth = 7;
      contrainte.gridheight = 8;
      contrainte.gridx = 0;
      contrainte.gridy = 5;
      conteneur.add(panelEtudiants, contrainte);

      hintManager.addHintFor(panelStats, "Dans ce panneau, vous verrez le nombre total d'étudiants, le nombre de notes attribuées, les notes min et max et enfin la moyenne générale des étudiants affichés.");

      panelStats.setPreferredSize(new Dimension(300, 150));
      panelStats.setBorder(BorderFactory.createTitledBorder(""));

      JLabel labelStats = new JLabel("Statistiques");
      labelStats.setPreferredSize(new Dimension(150, 30));
      labelStats.setForeground(Color.black);
      labelStats.setFont(police);
      panelStats.add(labelStats);

      JLabel labelTotal = new JLabel("Total notes / etudiants:");
      labelTotal.setFont(police);
      labelTotal.setForeground(Color.black);
      labelTotal.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelTotal);

      jtfTotal.setPreferredSize(new Dimension(40, 20));
      jtfTotal.setEditable(false);
      panelStats.add(jtfTotal);

      JLabel labelMoyenne = new JLabel("Moyenne:");
      labelMoyenne.setForeground(Color.black);
      labelMoyenne.setFont(police);
      labelMoyenne.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMoyenne);

      jtfMoyenne.setPreferredSize(new Dimension(40, 20));
      jtfMoyenne.setEditable(false);
      jtfMoyenne.setForeground(Color.blue);
      panelStats.add(jtfMoyenne);

      JLabel labelMax = new JLabel("Maximum:");
      labelMax.setFont(police);
      labelMax.setForeground(Color.black);
      labelMax.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMax);

      jtfMax.setPreferredSize(new Dimension(40, 20));
      jtfMax.setEditable(false);
      panelStats.add(jtfMax);

      JLabel labelMin = new JLabel("Minimum:");
      labelMin.setFont(police);
      labelMin.setForeground(Color.black);
      labelMin.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMin);

      jtfMin.setPreferredSize(new Dimension(40, 20));
      jtfMin.setEditable(false);
      panelStats.add(jtfMin);

      contrainte.insets = new Insets(10, 20, 0, 0);
      contrainte.gridx = 5;
      contrainte.gridy = 5;
      contrainte.gridheight = 6;
      conteneur.add(panelStats, contrainte);

      boutonImporter.setActionCommand("Importer");
      boutonImporter.setPreferredSize(new Dimension(140, 25));
      boutonImporter.setFont(police);
      boutonImporter.addActionListener(this);
      boutonImporter.setEnabled(false);
      contrainte.anchor = GridBagConstraints.CENTER;
      contrainte.gridx = 0;
      contrainte.gridy = 13;
      conteneur.add(boutonImporter, contrainte);

      Actualiser.setActionCommand("Actualiser");
      Actualiser.addActionListener(this);
      Actualiser.setPreferredSize(new Dimension(140, 25));
      Actualiser.setFont(police);
      Actualiser.setOpaque(false);
      Actualiser.setEnabled(false);
      contrainte.gridx = 2;
      contrainte.gridwidth = 1;
      conteneur.add(Actualiser, contrainte);

      Valider.setActionCommand("Valider");
      Valider.setPreferredSize(new Dimension(140, 25));
      Valider.addActionListener(this);
      Valider.setFont(police);
      Valider.setEnabled(false);
      contrainte.anchor = GridBagConstraints.EAST;
      contrainte.gridx = 4;
      conteneur.add(Valider, contrainte);

      labelBulle.setLineWrap(true);
      labelBulle.setWrapStyleWord(true);
      labelBulle.setPreferredSize(new Dimension(300, 150));
      labelBulle.setBorder(BorderFactory.createTitledBorder("Infos..."));
      contrainte.gridx = 5;
      contrainte.gridy = 11;
      contrainte.gridheight = 8;
      contrainte.gridwidth = 4;
      contrainte.anchor = 15;
      conteneur.add(labelBulle, contrainte);

      hintManager.addHintFor(conteneur, "Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
      conteneur.setSize(new Dimension(900, 620));
      Fond.add(conteneur);
      Fond.setSize(new Dimension(900, 620));
      superpoz.setPreferredSize(new Dimension(900, 620));
      superpoz.add(Fond);

      sablier.setOpaque(false);
      sablier.setSize(new Dimension(900, 620));
      //sablier.setIcon(new ImageIcon(this.getClass().getResource("sablier1.gif")));
      sablier.setBounds(380, 200, 160, 120);
      superpoz.add(sablier);
      superpoz.moveToFront(sablier);

      add(superpoz);
      setJMenuBar(barreMenu);
      hintManager.enableHints(this);
      //setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
      setLocation(ecran.width / 2 - 400, ecran.height / 2 - 300);
      setSize(new Dimension(900, 620));
      setResizable(false);
      setLayout(new FlowLayout(0, 0, 0));
      setVisible(true);
      boxDepartements.setEnabled(false);
      boxAnnee.setEnabled(false);
      boxMatiere.setEnabled(false);
      blocEtudiants.setOpaque(false);
      labelPanel.setOpaque(false);
      infosEtudiants.setOpaque(false);
      panelEtudiants.setOpaque(false);
      ascenseur.setOpaque(false);
      ascenseur.getViewport().setOpaque(false);
      panelBoutons.setOpaque(false);
      panelStats.setOpaque(false);
      labelStats.setOpaque(false);
      //labelEchoue.setOpaque(false);
      //labelValid.setOpaque(false);
      labelMax.setOpaque(false);
      labelMin.setOpaque(false);
      labelMoyenne.setOpaque(false);
      boutonImporter.setOpaque(false);
      Valider.setOpaque(false);
      labelBulle.setOpaque(false);
      conteneur.setOpaque(false);
      try
      {
         Iterator iter = myControlleur.getLesDepartementsView().iterator();
         if (!iter.hasNext())
         {
            display("Aucun département n'est présent dans la bd !");
         }
         else
         {
            while (iter.hasNext())
            {
               boxDepartements.addItem((String) iter.next());
            }
            labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
            boxDepartements.addActionListener(this);
            boxDepartements.setEnabled(true);
         }
      }
      catch (Exception ex)
      {
         display(ex.toString());
      }
      SimpleDateFormat formatter = new SimpleDateFormat("MMdd");
      Date currentTime_1 = new Date();
      currentDateInt = Integer.parseInt(formatter.format(currentTime_1));
      superpoz.moveToFront(Fond);
      this.addWindowListener(new WindowAdapter()
      {
         /**
          * cette petite fonction nous permet de spécifier l'action effectuée lorsqu'on clique sur la croix.
          * Ici, on réduit la fenetre courante et on affiche la fenetre d'accueil
          */
         public void windowClosing(WindowEvent we)
         {
            ((Enseignant) we.getSource()).myAccueil.setVisible(true);
            ((Enseignant) we.getSource()).setVisible(false);
         }
      });
   }

   /**
    * Fonction qui permet de traiter tous les évènements (cliques sur les elements des listes, clique sur une Checkbox, sur un bouton, sur un champ de note d'un etudiant,...)
    * @param e evenement déclenché (clic sur un bouton, choix dans une liste,...
    */
   public void actionPerformed(ActionEvent e)
   {
      if (e.getActionCommand().equals("changeDep"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     myControlleur.enregistrerNoteECUE();
                  }
                  nbModifications = 0;
               }
            }
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), -1, -1, -1, -1);
            viderLesAnnees();
            Iterator iter;

            iter = myControlleur.getLesAnneesView().iterator();
            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucune année ne correspond à votre recherche !"));
               blocEtudiants.setPreferredSize(new Dimension(470, 25));
            }
            else
            {
               while (iter.hasNext())
               {
                  boxAnnee.addItem((String) iter.next());
               }
               boxAnnee.addActionListener(this);
               boxAnnee.setEnabled(true);
            }
         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des années !");
         }
      }
      else if (e.getActionCommand().equals("changeAnnee"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     myControlleur.enregistrerNoteECUE();
                  }
                  nbModifications = 0;
               }
            }
            superpoz.moveToFront(sablier);
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, -1, -1);
            viderLesMatieres();

            Iterator iter = myControlleur.getLesECUECourantes().iterator();

            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucune matière ne correspond à votre recherche !"));
               blocEtudiants.setPreferredSize(new Dimension(470, 25));
            }
            else
            {
               while (iter.hasNext())
               {
                  boxMatiere.addItem((String) iter.next());
               }
               boxMatiere.addActionListener(this);
               boxMatiere.setEnabled(true);
            }

         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des matières !");
         }
         finally
         {
            superpoz.moveToFront(Fond);
         }
      }
      else if (e.getActionCommand().equals("changeMatiere"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerNoteECUE();
                  }
                  myControlleur.actualiserEtudiants();
                  nbModifications = 0;
               }
            }
            superpoz.moveToFront(sablier);
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, -1, boxMatiere.getSelectedIndex());
            viderLesEtudiants();
            Iterator iter;


            iter = myControlleur.getLesEtudiantsECUEView().iterator();            
            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucun étudiant ne correspond à votre recherche !"));
               blocEtudiants.setPreferredSize(new Dimension(470, 25));
            }
            else
            {
               Map<String, String> currentEtud;

               float currentNote;
               currentNbEtud = 0;
               while (iter.hasNext())
               {
                  currentEtud = (HashMap) iter.next();
                  lesEtudiants[currentNbEtud][0].setText(currentEtud.get("unNom"));
                  lesEtudiants[currentNbEtud][0].setFocusable(false);
                  lesEtudiants[currentNbEtud][1].setText(currentEtud.get("unPrenom"));
                  lesEtudiants[currentNbEtud][1].setFocusable(false);
                  lesEtudiants[currentNbEtud][2].setText("");
                  lesEtudiants[currentNbEtud][2].setText(currentEtud.get("uneNote"));
                  if (currentEtud.get("estRattrapage").equals("1"))
                  {
                     rattrapageEtudiant[currentNbEtud].setSelected(true);
                  }
                  else
                  {
                     rattrapageEtudiant[currentNbEtud].setSelected(false);
                  }
                  if(!lesEtudiants[currentNbEtud][2].getText().equals(""))
                  {
                     if (Float.parseFloat(lesEtudiants[currentNbEtud][2].getText().replace(',', '.')) < 10)
                     {
                        lesEtudiants[currentNbEtud][2].setForeground(Color.red);
                     }
                     else
                     {
                        lesEtudiants[currentNbEtud][2].setForeground(Color.green);
                     }
                  }
                  numEtudiants[currentNbEtud].setFocusable(false);
                  infosEtudiants.add(numEtudiants[currentNbEtud]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][0]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][1]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][2]);
                  rattrapageEtudiant[currentNbEtud].setFocusable(false);
                  infosEtudiants.add(rattrapageEtudiant[currentNbEtud]);
                  currentNbEtud = currentNbEtud + 1;
               }
               blocEtudiants.setPreferredSize(new Dimension(470, 28 * currentNbEtud + 5));

               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(true);
               }
               boutonImporter.setEnabled(true);
               Actualiser.setEnabled(true);
               Valider.setEnabled(true);
            }
            remplirStats(1);

         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des etudiants");
         }
         finally
         {
            infosEtudiants.updateUI();
            superpoz.moveToFront(Fond);
         }
      }
      else if (e.getSource().getClass().getSimpleName().equals("JCheckBox"))
      {
         try
         {
            nbModifications = nbModifications + 1;
            int numLigne = Integer.parseInt(((JCheckBox) e.getSource()).getName());
            
            if (rattrapageEtudiant[numLigne].isSelected())
            {
               myControlleur.setNote(lesEtudiants[numLigne][0].getText(), lesEtudiants[numLigne][1].getText(), lesEtudiants[numLigne][2].getText(), "true");
            }
            else
            {
               myControlleur.setNote(lesEtudiants[numLigne][0].getText(), lesEtudiants[numLigne][1].getText(), lesEtudiants[numLigne][2].getText(), "false");
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de la validation du rattrapage.");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Valider"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Etes-vous sûr(e) ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerNoteECUE();
                     myControlleur.actualiserEtudiants();
                     nbModifications = 0;
                  }                  
                  superpoz.moveToFront(Fond);
                  
               }
               
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de l'enregistrement des notes.");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Actualiser"))
      {
         try
         {
            superpoz.moveToFront(sablier);
            conteneur.updateUI();
            viderLesEtudiants();
            infosEtudiants.updateUI();
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerNoteECUE();
                  }
                  myControlleur.actualiserEtudiants();
                  nbModifications = 0;
               }
            }
            superpoz.moveToFront(sablier);
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, -1, boxMatiere.getSelectedIndex());
            viderLesEtudiants();
            Iterator iter;

            iter = myControlleur.getLesEtudiantsECUEView().iterator();
            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucun étudiant ne correspond à votre recherche !"));
               blocEtudiants.setPreferredSize(new Dimension(470, 25));
            }
            else
            {
               Map<String, String> currentEtud;

               float currentNote;
               currentNbEtud = 0;
               while (iter.hasNext())
               {
                  currentEtud = (HashMap) iter.next();
                  lesEtudiants[currentNbEtud][0].setText(currentEtud.get("unNom"));
                  lesEtudiants[currentNbEtud][1].setText(currentEtud.get("unPrenom"));
                  lesEtudiants[currentNbEtud][2].setText("");
                  lesEtudiants[currentNbEtud][2].setText(currentEtud.get("uneNote"));
                  if (currentEtud.get("estRattrapage").equals("1"))
                  {
                     rattrapageEtudiant[currentNbEtud].setSelected(true);
                  }
                  else
                  {
                     rattrapageEtudiant[currentNbEtud].setSelected(false);
                  }
                  if(!lesEtudiants[currentNbEtud][2].getText().equals(""))
                  {
                     if (Float.parseFloat(lesEtudiants[currentNbEtud][2].getText().replace(',', '.')) < 10)
                     {
                        lesEtudiants[currentNbEtud][2].setForeground(Color.red);
                     }
                     else
                     {
                        lesEtudiants[currentNbEtud][2].setForeground(Color.green);
                     }
                  }
                  infosEtudiants.add(numEtudiants[currentNbEtud]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][0]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][1]);
                  infosEtudiants.add(lesEtudiants[currentNbEtud][2]);
                  infosEtudiants.add(rattrapageEtudiant[currentNbEtud]);
                  currentNbEtud = currentNbEtud + 1;
               }
               blocEtudiants.setPreferredSize(new Dimension(470, 28 * currentNbEtud + 5));

               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(true);
               }
               boutonImporter.setEnabled(true);
               Actualiser.setEnabled(true);
               Valider.setEnabled(true);
            }
            remplirStats(1);
         }
         catch (Exception ex)
         {
            display("Erreur lors de l'actualisation");
            ex.printStackTrace();
         }
         finally
         {
            infosEtudiants.updateUI();
            superpoz.moveToFront(Fond);
         }
      }
      else if (e.getActionCommand().equals("Importer") || e.getActionCommand().equals("Exporter"))
      {
         display("Les fonction Importer/Exporter ne sont pas encore implémentée !!!");
      }
      else if (e.getSource().getClass().getSimpleName().equals("JButton"))
      {
         filtreLesEtudiants(e.getActionCommand());
      }      
      else if (e.getActionCommand().equals("APropos"))
      {
         textAPropos();
      }
      else if (e.getActionCommand().equals("Support"))
      {
         aide();
      }
      else if (e.getActionCommand().equals("Quitter"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer avant de quitter l'application ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);

                     myControlleur.enregistrerNoteECUE();

                     superpoz.moveToFront(Fond);
                  }
                  this.myAccueil.setVisible(true);
                  this.setVisible(false);
               }
            }
            else
            {
               this.myAccueil.setVisible(true);
               this.setVisible(false);
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de la fermeture de l'application.");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Nouveau"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  superpoz.moveToFront(sablier);
                  if (option == 0)
                  {

                     myControlleur.enregistrerNoteECUE();
                  }

                  viderLesAnnees();

                  for (int i = 0; i < 5; i++)
                  {
                     alphaButton[i].setEnabled(false);
                  }

                  boxDepartements.removeActionListener(this);
                  boxDepartements.removeAllItems();
                  boxDepartements.setEnabled(false);
                  boxAnnee.setEnabled(false);
                  boxMatiere.setEnabled(false);

                  try
                  {
                     Iterator iter = myControlleur.getLesDepartementsView().iterator();
                     if (!iter.hasNext())
                     {
                        display("Aucun département n'est présent dans la bd !");
                     }
                     else
                     {
                        while (iter.hasNext())
                        {
                           boxDepartements.addItem((String) iter.next());
                        }
                        labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
                        boxDepartements.addActionListener(this);
                        boxDepartements.setEnabled(true);
                     }

                  }
                  catch (Exception ex)
                  {
                     display("Erreur lors du chargement des départements !");
                     ex.printStackTrace();
                  }
                  superpoz.moveToFront(Fond);
               }
            }
            else
            {
               superpoz.moveToFront(sablier);
               viderLesAnnees();

               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(false);
               }

               boxDepartements.removeActionListener(this);
               boxDepartements.removeAllItems();
               boxDepartements.setEnabled(false);
               boxAnnee.setEnabled(false);
               boxMatiere.setEnabled(false);

               
                  Iterator iter = myControlleur.getLesDepartementsView().iterator();
                  if (!iter.hasNext())
                  {
                     display("Aucun département n'est présent dans la bd !");
                  }
                  else
                  {
                     while (iter.hasNext())
                     {
                        boxDepartements.addItem((String) iter.next());
                     }
                     labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
                     boxDepartements.addActionListener(this);
                     boxDepartements.setEnabled(true);
                  }

                           
               superpoz.moveToFront(Fond);
            }
            nbModifications = 0;
         }
         catch (Exception ex)
         {
            display("Erreur lors de la reinitialisation.");
            ex.printStackTrace();
         }
      }
   }

   /**
    * Fonction qui permet de vider le panneau des étudiant
    */
   public void viderLesEtudiants()
   {
      Actualiser.setEnabled(false);
      Valider.setEnabled(false);
      boutonImporter.setEnabled(false);
      for (int i = 0; i < 5; i++)
      {
         alphaButton[i].setEnabled(false);
      }
      infosEtudiants.removeAll();

      blocEtudiants.setPreferredSize(new Dimension(470, 240));
      infosEtudiants.updateUI();
      viderLesStats();
   }

   /**
    * Fonction qui permet de n'afficher qu'uniquement les etudiants dont le nom se situe entre les deux lettres de la chaine en paramètre.
    * @param intervalle chaine de 2 caractères qui précisent l'intervalle dans lequel le nom de l'etudiant doit être pour être affiché.
    */
   public void filtreLesEtudiants(String intervalle)
   {
      infosEtudiants.removeAll();
      Iterator iter;
      int nbEtudiantsFiltrés = 0;
      try
      {
         boolean unTrouve = false;
         int nbEtudiants = myControlleur.getLesEtudiantsECUEView().size();
         for(int i = 0 ; i< nbEtudiants; i++)
         {
           if(lesEtudiants[i][0].getText().charAt(0)>= intervalle.charAt(0) && lesEtudiants[i][0].getText().charAt(0)<= intervalle.charAt(1))
           {
              unTrouve = true;
              infosEtudiants.add(numEtudiants[i]);
              infosEtudiants.add(lesEtudiants[i][0]);
              infosEtudiants.add(lesEtudiants[i][1]);
              infosEtudiants.add(lesEtudiants[i][2]);
              infosEtudiants.add(rattrapageEtudiant[i]);
              nbEtudiantsFiltrés = nbEtudiantsFiltrés + 1;
           }
         }
         if (! unTrouve)
         {
            infosEtudiants.add(new JLabel("Aucun etudiant ne correspond à votre recherche."));
            blocEtudiants.setPreferredSize(new Dimension(470, 28));
         }
      }
      catch (Exception ex)
      {
         display("Erreur lors du chargement des etudiants filtrés");
         ex.printStackTrace();
      }
      finally
      {
         infosEtudiants.updateUI();
         blocEtudiants.setPreferredSize(new Dimension(470, 28 * nbEtudiantsFiltrés + 5));
      }
   }

   /**
    * fonction qui permet de vider le panel des statistiques
    */
   public void viderLesStats()
   {
      jtfMax.setText("");
      jtfMin.setText("");
      jtfMoyenne.setText("");
      jtfTotal.setText("");
      conteneur.updateUI();
   }

   /**
    * Fonction qui permet de remplir le panneau des statistiques
    */
   public void remplirStats(int showAlerte)
   {
      try
      {
         if (!myControlleur.getLesEtudiantsECUEView().isEmpty())
         {
            Map<String, String> stats;
            stats = myControlleur.getStatsECUE();
            jtfMax.setText(stats.get("max"));
            jtfMin.setText(stats.get("min"));
            jtfTotal.setText(stats.get("nbNote") + "/" + stats.get("nbEleve"));
            jtfMoyenne.setText(df.format(Double.parseDouble(stats.get("moyenne"))));
            if (!(stats.get("nbNote").equals(stats.get("nbEleve"))) && showAlerte == 1)
            {
               JOptionPane.showMessageDialog(this, "Attention: toutes les notes n'ont pas été entrées. Les champs remplis dans les statistiques ne sont donc pas définitifs !");
            }
         }
         else
         {
            jtfMax.setText("");
            jtfMin.setText("");
            jtfTotal.setText("");
            jtfMoyenne.setText("");
         }
      }
      catch (Exception ex)
      {
         display("Erreur lors du remplissage des stats !");
         ex.printStackTrace();
      }


   }

   /**
    * Fonction qui vide la liste des années
    */
   public void viderLesAnnees()
   {
      boxAnnee.removeActionListener(this);
      boxAnnee.removeAllItems();
      boxAnnee.setEnabled(false);
      viderLesMatieres();
   }

   /**
    * Fonction qui vide la liste des matières
    */
   public void viderLesMatieres()
   {
      boxMatiere.removeActionListener(this);
      boxMatiere.removeAllItems();
      boxMatiere.setEnabled(false);
      viderLesEtudiants();
   }

   /**
    * Fonction qui permet d'afficher des informations à l'utilisateur (sous forme de boite de dialogue)
    * @param message chaine de caractère à afficher
    */
   public final void display(String message)
   {
      JOptionPane.showMessageDialog(this, message);
   }

   /**
    * Fonction d'affichage de la fenetre du menu "A propos"    *
    */
   public void textAPropos()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 400));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Bonjour et Bienvenue dans le module de gestion de notes des Etudiants de Polytech Montpellier !\nUtilisation du module:\n\n");
      jtA.setText(jtA.getText() + "Vous devez selectionner un departement dans la liste deroulante. Les années correspondante seront chargées dans la seconde liste.\n");
      jtA.setText(jtA.getText() + "Lorsque vous selectionez une matière (après avoir choisi une année, les etudiants inscrits seront affichés dans le panneau dessous, avec leur note dans la matière, et une case à cocher, modifiable, indique si la note est une note de rattrapage.\n");
      jtA.setText(jtA.getText() + "Si vous cloquez sur un des boutons au dessus des étudiants, seuls les étudiants dont le nom se situe entre les lettres du bouton seront afichés.");
      jtA.setText(jtA.getText() + "A droite, vous pouvez voir un panneau de statistiques qui indique le nombre d'etudiants total, le nombre de notes données, la moyenne de la promo, et les notes maximales et minimales.\n");
      jtA.setText(jtA.getText() + "Dans le panneau, les etudiants qui n'ont pas validé voient leur moyenne affichée en rouge, et ceux qui ont validé ont leur moyenne en vert.\n");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }

   /**
    * Fonction d'affichage de la fenetre du menu "Aide"
    */
   public void aide()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 200));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Un problème ? Ce serait étonnant mais bon. Consultez le menu \" A Propos\".\nSi cela ne vous a pas aidé, contactez notre équipe ! ;-)");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }

   /**
    * Fonction de traitement de l'evenement focus (lorsque le curseur entre dans une zone de texte)
    * @param fe evenement qui a été declenché par la zone de texte sur laquelle on a positionné le curseur
    */
   public void focusGained(FocusEvent fe)
   {
      ((JTextField) fe.getSource()).setForeground(Color.black);
      oldNote = lesEtudiants[Integer.parseInt(((JTextField) fe.getSource()).getName())][2].getText();
   }

   /**
    * Fonction de traitement de l'evenement focus (lorsque le curseur sort dans une zone de texte)
    * @param fe evenement qui a été declenché par la zone de texte d'où est sorti le curseur
    */
   public void focusLost(FocusEvent fe)
   {
      int numLigne = Integer.parseInt(((JTextField) fe.getSource()).getName());
      if (!(oldNote.equals(lesEtudiants[numLigne][2].getText())))
      {
         if (Float.parseFloat(lesEtudiants[numLigne][2].getText()) > 20)
         {
            display("La notre doit être comprise entre 0 et 20 !!!!!!");
            lesEtudiants[numLigne][2].requestFocus();
            lesEtudiants[numLigne][2].setText(oldNote);
            lesEtudiants[numLigne][2].setSelectionStart(0);
            lesEtudiants[numLigne][2].setSelectionEnd(lesEtudiants[numLigne][2].getText().length());
         }
         else
         {
            nbModifications = nbModifications + 1;
            try
            {
               if (rattrapageEtudiant[numLigne].isSelected())
               {
                  myControlleur.setNote(lesEtudiants[numLigne][0].getText(), lesEtudiants[numLigne][1].getText(), lesEtudiants[numLigne][2].getText(), "true");
               }
               else
               {
                  myControlleur.setNote(lesEtudiants[numLigne][0].getText(), lesEtudiants[numLigne][1].getText(), lesEtudiants[numLigne][2].getText(), "false");
               }
               if(Float.parseFloat(((JTextField) fe.getSource()).getText().replace(',', '.')) < 10 )
                  ((JTextField) fe.getSource()).setForeground(Color.red);
               else
                  ((JTextField) fe.getSource()).setForeground(Color.green);
               remplirStats(0);
            }
            catch (Exception ex)
            {
               display("Erreur lors du changement de note. La note est peut-être vide.");
               ex.printStackTrace();
            }
         }
      }
   }
}
